/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package pe.edu.pucp.Maestros.DAO;

import java.util.ArrayList;
import java.util.Date;
import java.util.Iterator;
import java.util.List;
import org.hibernate.Hibernate;
import org.hibernate.Query;
import org.hibernate.Session;
import org.hibernate.Transaction;
import pe.edu.pucp.Modelo.EstadoVuelo;
import pe.edu.pucp.Modelo.Vuelo;
import pe.edu.pucp.Util.HibernateUtil;

/**
 *
 * @author pedro
 */
public class MaestoVueloDAO {

        public EstadoVuelo ListarEstadoVuelo(int id){
        
        Session session = HibernateUtil.getSessionFactory().openSession();
        Transaction tx = session.beginTransaction();
        EstadoVuelo a= new EstadoVuelo();
        List lista = session.createQuery("from EstadoVuelo where idEstado ="+id).list();
        
        for ( Iterator iter = lista.iterator(); iter.hasNext(); ) {    
            a = (EstadoVuelo) iter.next();
            Hibernate.initialize(a.getIdestado());
            Hibernate.initialize(a.getDescripcion());
        }
        
        tx.commit();
        session.close();
        return a;        
    }
    
    public ArrayList<Vuelo> ListarVuelosDeUnAeropuerto(int IdAeropuertoOrigen, Date desde, Date fin){
        
        ArrayList<Vuelo> lstvuelos = new ArrayList<>();
        Session session = HibernateUtil.getSessionFactory().openSession();
        Transaction tx = session.beginTransaction();

        String q = "from Vuelo where IdOrigen= :IdOrigenParam and  salidaest >= :fechasalidaInicioEstParam and salidaest <= :fechasalidaFinEstParam ";
        
        Query query = session.createQuery(q);
        query.setParameter("IdOrigenParam", IdAeropuertoOrigen);
        query.setParameter("fechasalidaInicioEstParam",desde);
        query.setParameter("fechasalidaFinEstParam",fin);
        
        List lista = query.list();
        for ( Iterator iter = lista.iterator(); iter.hasNext(); ) {    
            Vuelo a = (Vuelo) iter.next();
            Hibernate.initialize(a.getAeropuertoByIddestino());
            Hibernate.initialize(a.getAeropuertoByIddestino().getCiudad().getPais().getContinente());
            Hibernate.initialize(a.getAeropuertoByIddestino());
            Hibernate.initialize(a.getAeropuertoByIdorigen());
            Hibernate.initialize(a.getAvion());
            lstvuelos.add(a);
        }
        
        tx.commit();
        session.close();

        return lstvuelos;        
    }    
    
      public ArrayList<Vuelo> ListarVuelosDeUnAeropuerto(int IdAeropuertoOrigen){
        
        ArrayList<Vuelo> lstvuelos = new ArrayList<>();
        Session session = HibernateUtil.getSessionFactory().openSession();
        Transaction tx = session.beginTransaction();

        String q = "from Vuelo where IdOrigen= :IdOrigenParam";
        
        Query query = session.createQuery(q);
        query.setParameter("IdOrigenParam", IdAeropuertoOrigen);
         
        List lista = query.list();
        for ( Iterator iter = lista.iterator(); iter.hasNext(); ) {    
            Vuelo a = (Vuelo) iter.next();
            Hibernate.initialize(a.getAeropuertoByIddestino());
            Hibernate.initialize(a.getAeropuertoByIddestino().getCiudad().getPais().getContinente());
            Hibernate.initialize(a.getAeropuertoByIddestino());
            Hibernate.initialize(a.getAeropuertoByIdorigen());
            Hibernate.initialize(a.getAvion());
            lstvuelos.add(a);
        }
        
        tx.commit();
        session.close();

        return lstvuelos;        
    }    
        
    public ArrayList<Vuelo> ListarVuelos(){
        
        ArrayList<Vuelo> lstvuelos = new ArrayList<>();
        Session session = HibernateUtil.getSessionFactory().openSession();
        Transaction tx = session.beginTransaction();
        
        List lista = session.createQuery("from Vuelo").list();
        for ( Iterator iter = lista.iterator(); iter.hasNext(); ) {    
            Vuelo a = (Vuelo) iter.next();
            Hibernate.initialize(a.getAeropuertoByIddestino());
            Hibernate.initialize(a.getAeropuertoByIddestino().getCiudad().getPais().getContinente());
            Hibernate.initialize(a.getAeropuertoByIddestino());
            Hibernate.initialize(a.getAeropuertoByIdorigen());
            Hibernate.initialize(a.getAvion());
            Hibernate.initialize(a.getAvion().getTipoAvion());
            lstvuelos.add(a);
        }
        
        tx.commit();
        session.close();

        return lstvuelos;        
    }   
    
    public void guadarVuelo(Vuelo v)
    {
        Session session = HibernateUtil.getSessionFactory().openSession();
        Transaction tx =  session.beginTransaction();        
        
        try
        {
            session.save(v);
        }catch(Exception e)
        {
           throw e;
        }             

        tx.commit();
        session.close();
        
    }
    
    public ArrayList<EstadoVuelo> listarEstadosVuelos()
    {
        ArrayList<EstadoVuelo> listaEstadosVuelos = new ArrayList<>();      
        Session session = HibernateUtil.getSessionFactory().openSession();
        Transaction tx = session.beginTransaction();
        
        List lista = session.createQuery("from EstadoVuelo").list();
        for ( Iterator iter = lista.iterator(); iter.hasNext(); ) {    
            EstadoVuelo a = (EstadoVuelo) iter.next();
            listaEstadosVuelos.add(a);
        }
        
        tx.commit();
        session.close();

        return listaEstadosVuelos;
    } 
   
}
